// FollowController.js - 关注控制器
const Follow = require('../models/Follow');
const { sequelize } = require('../config/db');

/**
 * 关注控制器类
 * 处理用户关注相关的API请求
 */
class FollowController {
  /**
   * 关注用户
   * @param {Object} req - 请求对象
   * @param {Object} res - 响应对象
   */
  static async followUser(req, res) {
    try {
      const { userId } = req.body;
      const followerId = req.user.id;
      
      // 验证参数
      if (!userId || typeof userId !== 'number') {
        return res.status(400).json({
          code: 400,
          message: '请提供有效的用户ID',
          data: null
        });
      }
      
      // 检查目标用户是否存在
      const userExists = await sequelize.query(
        'SELECT id FROM users WHERE id = :userId',
        {
          replacements: { userId },
          type: sequelize.QueryTypes.SELECT
        }
      );
      
      if (userExists.length === 0) {
        return res.status(404).json({
          code: 404,
          message: '目标用户不存在',
          data: null
        });
      }
      
      // 不允许关注自己
      if (followerId === userId) {
        return res.status(400).json({
          code: 400,
          message: '不能关注自己',
          data: null
        });
      }
      
      // 检查是否已经关注
      const isFollowing = await Follow.checkFollow(followerId, userId);
      if (isFollowing) {
        return res.status(400).json({
          code: 400,
          message: '您已经关注该用户',
          data: null
        });
      }
      
      // 执行关注
      await Follow.create(followerId, userId);
      
      // 获取最新粉丝数
      const fanCount = await Follow.getFanCount(userId);
      
      res.status(200).json({
        code: 200,
        message: '关注成功',
        data: {
          followed: true,
          fanCount: fanCount
        }
      });
    } catch (error) {
      console.error('关注用户失败:', error);
      res.status(500).json({
        code: 500,
        message: '关注失败，请稍后重试',
        data: null
      });
    }
  }

  /**
   * 取消关注
   * @param {Object} req - 请求对象
   * @param {Object} res - 响应对象
   */
  static async unfollowUser(req, res) {
    try {
      const { userId } = req.body;
      const followerId = req.user.id;
      
      // 验证参数
      if (!userId || typeof userId !== 'number') {
        return res.status(400).json({
          code: 400,
          message: '请提供有效的用户ID',
          data: null
        });
      }
      
      // 检查是否已经关注
      const isFollowing = await Follow.checkFollow(followerId, userId);
      if (!isFollowing) {
        return res.status(400).json({
          code: 400,
          message: '您尚未关注该用户',
          data: null
        });
      }
      
      // 执行取消关注
      const result = await Follow.destroy(followerId, userId);
      
      if (result === 0) {
        return res.status(400).json({
          code: 400,
          message: '取消关注失败，可能您尚未关注',
          data: null
        });
      }
      
      // 获取最新粉丝数
      const fanCount = await Follow.getFanCount(userId);
      
      res.status(200).json({
        code: 200,
        message: '取消关注成功',
        data: {
          followed: false,
          fanCount: fanCount
        }
      });
    } catch (error) {
      console.error('取消关注失败:', error);
      res.status(500).json({
        code: 500,
        message: '取消关注失败，请稍后重试',
        data: null
      });
    }
  }

  /**
   * 检查关注状态
   * @param {Object} req - 请求对象
   * @param {Object} res - 响应对象
   */
  static async checkFollowStatus(req, res) {
    try {
      const { userId } = req.query;
      const followerId = req.user.id;
      
      // 验证参数
      if (!userId || typeof parseInt(userId) !== 'number') {
        return res.status(400).json({
          code: 400,
          message: '请提供有效的用户ID',
          data: null
        });
      }
      
      const targetUserId = parseInt(userId);
      
      // 检查是否已关注
      const isFollowing = await Follow.checkFollow(followerId, targetUserId);
      
      // 获取粉丝数
      const fanCount = await Follow.getFanCount(targetUserId);
      
      res.status(200).json({
        code: 200,
        message: '获取关注状态成功',
        data: {
          followed: isFollowing,
          fanCount: fanCount
        }
      });
    } catch (error) {
      console.error('获取关注状态失败:', error);
      res.status(500).json({
        code: 500,
        message: '获取关注状态失败，请稍后重试',
        data: null
      });
    }
  }
}

module.exports = FollowController;